
/**
 * 项目名称:util
 * 文件名称:ReflectUtil.java
 * 包名称:org.xinghai.com.maras.util
 * 日期:2018年12月11日 下午4:16:21
 */
package com.cg.javafxdemospring.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * <p>
 * 类名称: ReflectUtil
 * </p>
 * <p>
 * 功能: ()
 * </p>
 * <p>
 * 公司: 星海信息技术有限公司
 * </p>
 * 
 * @author 陈刚
 * @date 2018年12月11日 下午4:16:21
 */
public class ReflectUtil {
	
	private static final String get = "get";
	private static final String set = "set";
	/**
	 * <p>getFieldGetter:()</p>
	 * @description 
	 * @author 陈刚
	 * @date 2019年1月7日 上午11:50:45 
	 */
	public static String getFieldGetter(String fieldName) {
		return get+ UserStringUtil.capFirst(fieldName);
	}
	
	public static String getFieldSetter(String fieldName) {
		return set+UserStringUtil.capFirst(fieldName);
	}

	/**
	 * <p>
	 * getDeclaredMethod:()
	 * </p>
	 * 
	 * @description
	 * @author 陈刚
	 * @date 2018年12月11日 下午4:16:43
	 */
	public static Method getDeclaredMethod(Object object, String methodName, Class<?>... parameterTypes) {
		Method method = null;
		for (Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
			try {
				method = clazz.getDeclaredMethod(methodName, parameterTypes);
				return method;
			} catch (Exception e) {
				// 这里甚么都不要做！并且这里的异常必须这样写，不能抛出去。 //
				// 如果这里的异常打印或者往外抛，则就不会执行clazz=clazz.getSuperclass(),最后就不会进入到父类中了
			}
		}
		return null;

	}
	
	/**
	 * <p>
	 * getDeclaredMethod:()
	 * </p>
	 * 
	 * @description
	 * @author 陈刚
	 * @date 2018年12月11日 下午4:16:43
	 */
	public static Field getDeclaredField(Object object, String fieldName) {
		Field field = null;
		for (Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
			try {
				field = clazz.getDeclaredField(fieldName);
				return field;
			} catch (Exception e) {
				// 这里甚么都不要做！并且这里的异常必须这样写，不能抛出去。 //
				// 如果这里的异常打印或者往外抛，则就不会执行clazz=clazz.getSuperclass(),最后就不会进入到父类中了
				Class<?>[] interfaces = clazz.getInterfaces();
				for (Class<?> interface1 : interfaces) {
					try {
						field = interface1.getDeclaredField(fieldName);
					} catch (Exception e1) {
						// 这里甚么都不要做！并且这里的异常必须这样写，不能抛出去。 //
					}
					return field;
				}
			}
		}
		return null;

	}
	
	/**
	 * <p>
	 * getDeclaredMethod:()
	 * </p>
	 * 
	 * @description
	 * @author 陈刚
	 * @date 2018年12月11日 下午4:16:43
	 */
	public static Field getDeclaredField(Class<?> clazz, String fieldName) {
		Field field = null;
		for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
			try {
				field = clazz.getDeclaredField(fieldName);
				return field;
			} catch (Exception e) {
				// 这里甚么都不要做！并且这里的异常必须这样写，不能抛出去。 //
				// 如果这里的异常打印或者往外抛，则就不会执行clazz=clazz.getSuperclass(),最后就不会进入到父类中了
				Class<?>[] interfaces = clazz.getInterfaces();
				for (Class<?> interface1 : interfaces) {
					try {
						field = interface1.getDeclaredField(fieldName);
					} catch (Exception e1) {
						// 这里甚么都不要做！并且这里的异常必须这样写，不能抛出去。 //
					}
					return field;
				}
			}
		}
		return null;

	}
	
	
	/**
	 * <p>getDeclaredFields:()</p>
	 * @description 
	 * @author 陈刚
	 * @date 2019年1月7日 上午11:38:18
	 * @param object
	 * @return 
	 */
	public static List<Field> getDeclaredFields(Object object) {
		List<Field> fields = new ArrayList<Field>();
		for (Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
			try {
				fields.addAll(Arrays.asList(clazz.getDeclaredFields())) ;
			} catch (Exception e) {
				// 这里甚么都不要做！并且这里的异常必须这样写，不能抛出去。 //
				// 如果这里的异常打印或者往外抛，则就不会执行clazz=clazz.getSuperclass(),最后就不会进入到父类中了
			}
		}
		return fields;

	}
	
	
	public static void modifyAuthority(Object object,String fieldName){
		try {
			Field field = object.getClass().getDeclaredField(fieldName);
			Field modifiersField = Field.class.getDeclaredField("modifiers");
			modifiersField.setAccessible(true);
			modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void modifyAuthority(Field field){
		try {
			Field modifiersField = Field.class.getDeclaredField("modifiers");
			modifiersField.setAccessible(true);
			modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
			field.setAccessible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
